package com.example.design_pattern.builder;

// 建造者模式和工厂模式的不同
// 建造者模式:
// 主要用于创建复杂对象。
// 注重创建过程的分步骤控制。
// 提供了对象的创建与表示分离。

// 工厂模式:
// 简单工厂模式用于创建简单对象。
// 工厂方法模式用于延迟到子类决定创建的对象。
// 抽象工厂模式用于创建一系列相关的对象。

//建造者模式（Builder Pattern）的介绍：
// 意图: 将一个复杂对象的构建过程与其表示分离，使得同样的构建过程可以创建不同的表示。
//
// 使用场景:
// 创建复杂对象时，涉及多个步骤和部件。
// 需要灵活创建复杂对象的不同表示。
// 需要确保创建过程中的一致性和可读性。
//
// 主要角色:
// Builder: 定义创建产品的接口。
// ConcreteBuilder: 实现Builder接口，构造和装配各个部件。
// Product: 表示被构造的复杂对象。
// Director: 构造使用Builder接口的对象。

// 产品。要构建的产品，比如面条例子里面的订单。
class Product {

    // 空容器而已。装产品组成部分的分部。
    private String part1; // 产品包括多个部分。比如订单包括多份食品。
    private String part2;

    // setters and getters
    public String getPart1() {
        return part1;
    }

    public void setPart1(String part1) {
        this.part1 = part1;
    }

    public String getPart2() {
        return part2;
    }

    public void setPart2(String part2) {
        this.part2 = part2;
    }
}


// 构建器的接口而已。仅仅提供了抽象方法。
interface Builder {
    void buildPart1(); // 构建器接口里面针对产品的第1部分，对应地提供的抽象的构建方法
    void buildPart2(); // 构建器接口里面针对产品的第2部分，对应地提供的抽象的构建方法
    Product getResult(); // 返回构建完的完整的产品。
}


// 具体的构造器。
class ConcreteBuilder implements Builder {

    // 空容器而已，用来装构建完成后的完整的产品，到时候就返回这个。
    private Product product = new Product(); // 自己在这里new的空Product

    @Override
    public void buildPart1() { // 具体的构建分部的逻辑。
        product.setPart1("Part1");
    }

    @Override
    public void buildPart2() { // 具体的构建分部的逻辑。
        product.setPart2("Part2");
    }

    @Override
    public Product getResult() { // 返回完整的产品。
        return product;
    }
}


// builder可以认为，它只是提供了一系列的设计和蓝图。但是，它并没有实际调用。而Director类，则是一份如何调用它的规则。
// Director只是提供如何调用builder的规则。它都写好调用了。但是它仅仅是一个类，类其实是一份规则，一份模版。真正实际调用还是要到BuilderPatternExample测试类的main方法里面。
class Director {
    // 空容器，接收构造函数传进来的builder的
    private Builder builder;

    // 构造函数
    public Director(Builder builder) {
        this.builder = builder;
    }

    // 真正组装不同分部的build方法的方法
    public Product construct() {
        builder.buildPart1();
        builder.buildPart2();
        return builder.getResult();
    }
}


public class BuilderPatternExample {
    public static void main(String[] args) {
        // 创建了一个具体的builder对象
        Builder builder = new ConcreteBuilder();
        // 把builder给director
        Director director = new Director(builder);
        // 得到最终构建出来的完整的产品。
        Product product = director.construct();
        // Use the product
    }
}

